﻿using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Runtime.Serialization;
using KPIS.GERP.Models.HRM;

namespace KPIS.GERP.Models.SYS.ViewModel
{
    [DataContract]
    public class CheckAbsenceRuleResultVM
    {
        #region Absence
        [DataMember]public int? AbsenceId { get; set; }
        [DataMember]public int AbsenceTypeId { get; set; }
        [DataMember]public int EmpId { get; set; }
        [DataMember]public int BgYear { get; set; }
        [DataMember]public DateTime CreateDate { get; set; }
        [DataMember]public DateTime StartDate { get; set; }
        [DataMember]public string StartTime { get; set; }
        [DataMember]public DateTime EndDate { get; set; }
        [DataMember]public string EndTime { get; set; }
        #endregion

        #region InsertResult
        [DataMember]public PsAbsence Absence { get; set; }
        #endregion

        #region CheckResult
        [DataMember]public decimal DayLimit { get; set; } // จำกัดจำนวนวันลาทั้งปี 
        [DataMember]public decimal QuotaLeaveCountDaysBefore { get; set; } // จำนวนโคว์ต้าที่เหลือ ก่อนหักคำขอตรวจสอบ ถ้าเป็น 0 คือ โคว์ต้าเหลือ 0 วัน ลาไม่ได้ 
        [DataMember]public ICollection<CheckAbsenceRuleResultItemVM> CheckListItem { get; set; }  // เช็คลิส ระบบการลา มี Flag warning/error ถ้าไม่มีปัญหา ก็คือผ่าน ถ้า error จะไม่ให้บันทึก
        [DataMember]public int CreateBy { get; set; } // สร้างคำขอโดย
        [DataMember]public string Remarks { get; set; } // จะนำข้อความ warning / errror message มาใส่
        [DataMember]public bool IsError { get; set; } // สรุปภาพรวมทั้งหมดของ CheckListItem ว่ามี errro\r มั้ย
        [DataMember]public bool IsWarning { get; set; }// สรุปภาพรวมทั้งหมดของ CheckListItem ว่ามี warning มั้ย
        #endregion
        

        #region RuleAbsence Information
        [DataMember]public RuleAbsence RuleAbsence { get; set; } // RuleAbsence ที่โหลดได้ (ต้องตรงกับ EmpTypeId + ตรงกับ AbsenceTypeId)
        [DataMember]public decimal MyAllTimeCount { get; set; } // จำนวนครั้งที่ลาไปแล้วทั้งหมด ไม่รวมคำขอตรวจสอบ
        [DataMember]public decimal MyAllDayCount { get; set; } // จำนวนวันลาที่ลาไปแล้วทั้งหมด ไม่รวมคำขอตรวจสอบ
        [DataMember]public decimal RequestTimeCount { get; set; } // จำนวนครั้งที่ขอตรวจสอบ ( เท่ากับ 1 ครั้งเสมอ)
        [DataMember]public decimal RequestDayCount { get; set; } // จำนวนวันลาที่ขอตรวจสอบ
        [DataMember]public decimal MyAllAndRequestDayCount { get; set; } // จำนวนครั้งที่ลาไปแล้วทั้งหมด รวมคำขอตรวจสอบ
        [DataMember]public decimal MyAllAndRequestTimeCount { get; set; } // จำนวนวันลาที่ลาไปแล้วทั้งหมด รวมคำขอตรวจสอบ
        #endregion
        
        public CheckAbsenceRuleResultVM()
        {
            CheckListItem = new Collection<CheckAbsenceRuleResultItemVM>();
            RequestTimeCount = 1;
        }

        #region Check list, key = title
        private CheckAbsenceRuleResultItemVM AddCheckList(string titleKey)
        {
            CheckListItem.Add(new CheckAbsenceRuleResultItemVM(titleKey));
            return CheckListItem.First(o => o.CheckTitle == titleKey);
        }
        
        public CheckAbsenceRuleResultVM Msg(
            string titleKey, string okReason)
        {
            var checkListItem = CheckListItem.FirstOrDefault(o => o.CheckTitle == titleKey) ?? AddCheckList(titleKey);
            checkListItem.Reasons = okReason;
            {
                Remarks = GetMessageErrorAndWarning();
                IsError = GetMessageError().Count > 0;
                IsWarning = GetMessageWarning().Count > 0;
            }
            return this;
        }

        public CheckAbsenceRuleResultVM Ok(
            string titleKey, string okReason)
        {
            var checkListItem = CheckListItem.FirstOrDefault(o => o.CheckTitle == titleKey) ?? AddCheckList(titleKey);
            checkListItem.Reasons = "[ผ่าน]" + okReason;
            {
                Remarks = GetMessageErrorAndWarning();
                IsError = GetMessageError().Count > 0;
                IsWarning = GetMessageWarning().Count > 0;
            }
            return this;
        }
        
        public CheckAbsenceRuleResultVM Error(
            string titleKey, string errorReason)
        {
            var checkListItem = CheckListItem.FirstOrDefault(o => o.CheckTitle == titleKey) ?? AddCheckList(titleKey);
            checkListItem.IsError = true;
            checkListItem.Reasons = "[ไม่ผ่าน]" + errorReason;
            {
                Remarks = GetMessageErrorAndWarning();
                IsError = GetMessageError().Count > 0;
                IsWarning = GetMessageWarning().Count > 0;
            }
            return this;
        }

        public CheckAbsenceRuleResultVM Warning(
            string titleKey, string errorReason)
        {
            var checkListItem = CheckListItem.FirstOrDefault(o => o.CheckTitle == titleKey) ?? AddCheckList(titleKey);
            checkListItem.IsWarning = true;
            checkListItem.Reasons = "[ผ่าน*]" + errorReason;
            {
                Remarks = GetMessageErrorAndWarning();
                IsError = GetMessageError().Count > 0;
                IsWarning = GetMessageWarning().Count > 0;
            }
            return this;
        }

        public List<string> GetMessageError()
        {
            List<string> result = new List<string>();
            foreach(var checkListItem in CheckListItem.Where(o=>o.IsError))
            {
                result.Add(checkListItem.CheckTitle + ": " + checkListItem.Reasons);
            }
            return result;
        }

        public List<string> GetMessageWarning()
        {
            List<string> result = new List<string>();
            foreach(var checkListItem in CheckListItem.Where(o=>o.IsWarning))
            {
                result.Add(checkListItem.CheckTitle + ": " + checkListItem.Reasons);
            }
            return result;
        }

        public string GetMessageErrorAndWarning()
        {
            var m1 = this.GetMessageError();
            m1.AddRange(this.GetMessageWarning());
            var m2 = m1.ToArray();
            return string.Join(";", m2);
        }
        #endregion
    }
}